package agentes09.gestor.behaviours;

import agentes09.gestor.AgenteGestor;
import agentes09.gestor.EstadoAgente;
import jade.content.onto.basic.Action;
import jade.core.AID;
import jade.core.behaviours.CyclicBehaviour;
import jade.domain.DFService;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.UnreadableException;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Recibe los mensajes con la situación actual de los agentes del juego.
 * @author Briseida Sarasola
 * @version 0.1
 */
public class RecibirMensajesGestion extends CyclicBehaviour {

	public RecibirMensajesGestion(AgenteGestor agente) {
		super(agente);
	}

	@Override
	public void action() {

		// Recibir propuestas
		ACLMessage msg = myAgent.receive();
		if (msg != null && msg.getPerformative() == ACLMessage.INFORM) {
			System.out.println("Gestor: Mensaje recibido =" + msg.getConversationId());

			AgenteGestor gestor = (AgenteGestor) myAgent;
			try {
				// Recomponer la accion
				//Action accion = (Action) myAgent.getContentManager().extractContent(msg);

				//AID agenteAID = accion.getActor();
				AID agenteAID = msg.getSender();
				EstadoAgente registro = (EstadoAgente) msg.getContentObject();
				System.out.println("Registro recibido");
				System.out.println(registro);

				// Obtener tipo de agente del DF
				DFAgentDescription dfd = new DFAgentDescription();
				dfd.setName(agenteAID);
				DFAgentDescription[] result = DFService.search(myAgent, dfd);
				String tipoAgente = "";
				if (result.length == 0) {
					System.out.println("ERROR");
				} else {
					Iterator iter = result[0].getAllServices(); // Result debería tener un solo agente, y cada agente, un solo servicio
					while (iter.hasNext()) {
						ServiceDescription sd = (ServiceDescription) iter.next();
						tipoAgente = sd.getType();
					}
				}

				// Actualizar información en el gestor
				gestor.anyadirRegistro(agenteAID, tipoAgente, registro);
			} catch (Exception e) {
				Logger.getAnonymousLogger().severe("Excepción en la recepción de mensajes");
				e.printStackTrace();
			}
//        } else if (msg != null && msg.getPerformative() == ACLMessage.REFUSE) {
		} else {
			block();
		}

	}
}
